/* 
 * Bitmain Tech, Home of Professional Bitmain Tech
 * Copyright 2014 Bitmain Tech Inc. and/or its affiliates and other contributors
 * as indicated by the @author tags. All rights reserved.
 * See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 */
package com.bitmain.mmst.feature.mybatis.paging;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.RowBounds;

/**
 * 封装分页参数及查询结果
 *
 * @author Kweny - enkun.jiang@bitmain.com
 * @since 2015年12月24日
 *
 */
public class PagingToken<T> extends RowBounds {
	/**
	 * 页码，默认第一页
	 */
	protected int pageNumber = 1;
	/**
	 * 每页显示的记录数，默认为10
	 */
	protected int pageSize = 10;
	/**
	 * 总记录数
	 */
	protected int totalRecord = -1;
	/**
	 * 总页数
	 */
	protected int totalPage = -1;
	/**
	 * 偏移量 : 第一条数据在表中的位置
	 */
	protected int offset = -1;
	/**
	 * 限定数 : 每页的数量
	 */
	protected int limit;
	/**
	 * 查询结果
	 */
	protected List<T> result = new ArrayList<T>();
	
	// --计算 数据库 查询的参数 : LIMIT 3, 3; LIMIT offset, limit; --//
	/**
	 * 计算偏移量
	 */
	private void calcOffset() {
		this.offset = ((pageNumber - 1) * pageSize);
	}
	
	/**
	 * 计算限定数
	 */
	private void calcLimit() {
		this.limit = pageSize;
	}
	
	public PagingToken() {
		this.calcOffset();
		this.calcLimit();
	}
	
	public PagingToken(int pageNumber, int pageSize) {
		this.setPageNumber(pageNumber);
		this.pageSize = pageSize;
		this.calcOffset();
		this.calcLimit();
	}
	
	/**
	 * 设置当前页码
	 */
	public void setPageNumber(int pageNumber) {
		if (pageNumber < 1) {
			pageNumber = 1;
		}
		this.pageNumber = pageNumber;
		this.calcOffset();
		this.calcLimit();
	}
	
	/**
	 * 获得当前页码，序号从1开始，默认为1
	 */
	public int getPageNumber() {
		return pageNumber;
	}
	
	/**
	 * 设置每页的记录数量
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	
	/**
	 * 获得每页的记录数量，默认为10
	 */
	public int getPageSize() {
		return pageSize;
	}
	
	/**
	 * 根据pageNumber和pageSize计算当前页第一条记录在总结果集中的位置，序号从1开始
	 */
	public int getFirst() {
		return ((pageNumber - 1) * pageSize) + 1;
	}
	
	/**
	 * 根据pageNumber和pageSize计算当前页第一条记录在总结果集中的位置，序号从-1开始
	 */
	public int getOffset() {
		return offset;
	}
	
	public int getLimit() {
		return limit;
	}
	
	/**
	 * 取得页内的记录列表.
	 */
	public List<T> getResult() {
		return result;
	}
	
	/**
	 * 设置页内的记录列表.
	 */
	public void setResult(final List<T> result) {
		this.result = result;
	}
	
	/**
	 * 取得总记录数, 默认值为-1.
	 */
	public int getTotalRecord() {
		return totalRecord;
	}
	
	/**
	 * 设置总记录数.
	 */
	public void setTotalRecord(final int totalRecord) {
		this.totalRecord = totalRecord;
		this.totalPage = getTotalPage();
		if (pageNumber > totalPage) {
			this.setPageNumber(totalPage);
		}
	}
	
	/**
	 * 根据pageSize与totalRecord计算总页数, 默认值为0.
	 */
	public int getTotalPage() {
		return (totalRecord + pageSize - 1) / pageSize;
	}
	
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	/**
	 * @param offset the offset to set
	 */
	public void setOffset(int offset) {
		this.offset = offset;
	}

	/**
	 * @param limit the limit to set
	 */
	public void setLimit(int limit) {
		this.limit = limit;
	}
	
}
